home *** CD-ROM | disk | FTP | other *** search
/ PC go! 2008 April / PCgo 2008-04 (DVD).iso / interface / contents / demoversionen_3846 / 13664 / files / Data1.cab / sdkdemoctl.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-10-16  |  15.3 KB  |  601 lines

  1. /******************************************************************/
  2. /*                                                                */
  3. /*                      TurboCAD for Windows                      */
  4. /*                   Copyright (c) 1993 - 2001                    */
  5. /*             International Microcomputer Software, Inc.         */
  6. /*                            (IMSI)                              */
  7. /*                      All rights reserved.                      */
  8. /*                                                                */
  9. /******************************************************************/
  10.  
  11. // SDKDemoCtl.cpp : Implementation of the CSDKDemoCtrl OLE control class.
  12.  
  13. #include "stdafx.h"
  14. #include "SDKDemo.h"
  15. #include "SDKDemoCtl.h"
  16. #include "SDKDemoPpg.h"
  17.  
  18.  
  19. #ifdef _DEBUG
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24.  
  25. // Make a "missing" optional parameter
  26. COleVariant varMissing((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
  27.  
  28. IMPLEMENT_DYNCREATE(CSDKDemoCtrl, COleControl)
  29.  
  30.  
  31. /////////////////////////////////////////////////////////////////////////////
  32. // Message map
  33.  
  34. BEGIN_MESSAGE_MAP(CSDKDemoCtrl, COleControl)
  35.     //{{AFX_MSG_MAP(CSDKDemoCtrl)
  36.     ON_WM_CREATE()
  37.     ON_WM_LBUTTONDOWN()
  38.     ON_WM_LBUTTONUP()
  39.     ON_WM_MOUSEMOVE()
  40.     //}}AFX_MSG_MAP
  41.     ON_OLEVERB(AFX_IDS_VERB_EDIT, OnEdit)
  42.     ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  43. END_MESSAGE_MAP()
  44.  
  45.  
  46. /////////////////////////////////////////////////////////////////////////////
  47. // Dispatch map
  48.  
  49. BEGIN_DISPATCH_MAP(CSDKDemoCtrl, COleControl)
  50.     //{{AFX_DISPATCH_MAP(CSDKDemoCtrl)
  51.     DISP_PROPERTY_NOTIFY(CSDKDemoCtrl, "FileName", m_strFileName, OnFileNameChanged, VT_BSTR)
  52.     DISP_PROPERTY_NOTIFY(CSDKDemoCtrl, "HideLayers", m_strHideLayers, OnHideLayersChanged, VT_BSTR)
  53.     DISP_PROPERTY_EX(CSDKDemoCtrl, "AllLayers", GetAllLayers, SetNotSupported, VT_BSTR)
  54.     DISP_STOCKPROP_BACKCOLOR()
  55.     //}}AFX_DISPATCH_MAP
  56.     //}}AFX_DISPATCH_MAP
  57.     DISP_FUNCTION_ID(CSDKDemoCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
  58. END_DISPATCH_MAP()
  59.  
  60.  
  61. /////////////////////////////////////////////////////////////////////////////
  62. // Event map
  63.  
  64. BEGIN_EVENT_MAP(CSDKDemoCtrl, COleControl)
  65.     //{{AFX_EVENT_MAP(CSDKDemoCtrl)
  66.     // NOTE - ClassWizard will add and remove event map entries
  67.     //    DO NOT EDIT what you see in these blocks of generated code !
  68.     //}}AFX_EVENT_MAP
  69. END_EVENT_MAP()
  70.  
  71.  
  72. /////////////////////////////////////////////////////////////////////////////
  73. // Property pages
  74.  
  75. // TODO: Add more property pages as needed.  Remember to increase the count!
  76. BEGIN_PROPPAGEIDS(CSDKDemoCtrl, 1)
  77.     PROPPAGEID(CSDKDemoPropPage::guid)
  78. END_PROPPAGEIDS(CSDKDemoCtrl)
  79.  
  80.  
  81. /////////////////////////////////////////////////////////////////////////////
  82. // Initialize class factory and guid
  83.  
  84. IMPLEMENT_OLECREATE_EX(CSDKDemoCtrl, "SDKDEMO.SDKDemoCtrl.1",
  85.     0xa63e6664, 0xc85f, 0x11d0, 0x9b, 0x3b, 0x44, 0x45, 0x53, 0x54, 0, 0)
  86.  
  87.  
  88. /////////////////////////////////////////////////////////////////////////////
  89. // Type library ID and version
  90.  
  91. IMPLEMENT_OLETYPELIB(CSDKDemoCtrl, _tlid, _wVerMajor, _wVerMinor)
  92.  
  93.  
  94. /////////////////////////////////////////////////////////////////////////////
  95. // Interface IDs
  96.  
  97. const IID BASED_CODE IID_DSDKDemo =
  98.         { 0xa63e6662, 0xc85f, 0x11d0, { 0x9b, 0x3b, 0x44, 0x45, 0x53, 0x54, 0, 0 } };
  99. const IID BASED_CODE IID_DSDKDemoEvents =
  100.         { 0xa63e6663, 0xc85f, 0x11d0, { 0x9b, 0x3b, 0x44, 0x45, 0x53, 0x54, 0, 0 } };
  101.  
  102.  
  103. /////////////////////////////////////////////////////////////////////////////
  104. // Control type information
  105.  
  106. static const DWORD BASED_CODE _dwSDKDemoOleMisc =
  107.     OLEMISC_ACTIVATEWHENVISIBLE |
  108.     OLEMISC_SETCLIENTSITEFIRST |
  109.     OLEMISC_INSIDEOUT |
  110.     OLEMISC_CANTLINKINSIDE |
  111.     OLEMISC_RECOMPOSEONRESIZE;
  112.  
  113. IMPLEMENT_OLECTLTYPE(CSDKDemoCtrl, IDS_SDKDEMO, _dwSDKDemoOleMisc)
  114.  
  115.  
  116. /////////////////////////////////////////////////////////////////////////////
  117. // CSDKDemoCtrl::CSDKDemoCtrlFactory::UpdateRegistry -
  118. // Adds or removes system registry entries for CSDKDemoCtrl
  119.  
  120. BOOL CSDKDemoCtrl::CSDKDemoCtrlFactory::UpdateRegistry(BOOL bRegister)
  121. {
  122.     // TODO: Verify that your control follows apartment-model threading rules.
  123.     // Refer to MFC TechNote 64 for more information.
  124.     // If your control does not conform to the apartment-model rules, then
  125.     // you must modify the code below, changing the 6th parameter from
  126.     // afxRegInsertable | afxRegApartmentThreading to afxRegInsertable.
  127.  
  128.     if (bRegister)
  129.         return AfxOleRegisterControlClass(
  130.             AfxGetInstanceHandle(),
  131.             m_clsid,
  132.             m_lpszProgID,
  133.             IDS_SDKDEMO,
  134.             IDB_SDKDEMO,
  135.             afxRegInsertable | afxRegApartmentThreading,
  136.             _dwSDKDemoOleMisc,
  137.             _tlid,
  138.             _wVerMajor,
  139.             _wVerMinor);
  140.     else
  141.         return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  142. }
  143.  
  144.  
  145. /////////////////////////////////////////////////////////////////////////////
  146. // CSDKDemoCtrl::CSDKDemoCtrl - Constructor
  147.  
  148. CSDKDemoCtrl::CSDKDemoCtrl() :
  149.     m_bFirstDraw(TRUE),
  150.     m_pIApp(NULL),
  151.     m_pIDrawing(NULL),
  152.     m_pView(NULL),
  153.     m_ptMouseDown(CPoint(0, 0)),
  154.     m_dragX(0),
  155.     m_dragY(0),
  156.     m_bDragging(FALSE),
  157.     m_pDragGraphic(NULL)
  158. {
  159.     InitializeIIDs(&IID_DSDKDemo, &IID_DSDKDemoEvents);
  160.     VariantInit(&m_dragOutline);
  161. }
  162.  
  163.  
  164. /////////////////////////////////////////////////////////////////////////////
  165. // CSDKDemoCtrl::~CSDKDemoCtrl - Destructor
  166.  
  167. CSDKDemoCtrl::~CSDKDemoCtrl()
  168. {
  169.     VariantClear(&m_dragOutline);
  170.     CloseDrawing();
  171.     if (m_pIApp != NULL)
  172.         m_pIApp->Release();
  173. }
  174.  
  175. BOOL CSDKDemoCtrl::OpenDrawing(const CString& strFileName)
  176. {
  177.     if (m_pIApp == NULL)
  178.         return FALSE;
  179.     
  180.     Drawings* pDrawings;
  181.     HRESULT hRes = m_pIApp->get_Drawings(&pDrawings);
  182.     if (FAILED(hRes))
  183.         return FALSE;
  184.  
  185.     // Get the file name into a BSTR
  186.     BSTR bstrPath = strFileName.AllocSysString();
  187.  
  188.     // Add the drawing to the drawings collection
  189.     IDrawing* pIDrawing;
  190.     hRes = pDrawings->Open(bstrPath, &varMissing, &varMissing, &pIDrawing);
  191.  
  192.     // Free the system memory for the BSTR
  193.     ::SysFreeString(bstrPath);
  194.  
  195.     if (SUCCEEDED(hRes))
  196.     {
  197.         Views* pViews;
  198.         hRes = pIDrawing->get_Views(&pViews);
  199.         if (SUCCEEDED(hRes))
  200.         {
  201.             View* pView;
  202.             hRes = pViews->Add(&varMissing, &varMissing, &pView);
  203.             if (SUCCEEDED(hRes))
  204.             {
  205.                 CloseDrawing();
  206.  
  207.                 m_pIDrawing = pIDrawing;
  208.                 m_pView = pView;
  209.                 Layers* pLayers;
  210.                 if (SUCCEEDED(m_pIDrawing->get_Layers(&pLayers)))
  211.                 {
  212.                     COleVariant varIndex(0L);
  213.                     for ( ; ; varIndex.lVal++)
  214.                     {
  215.                         Layer* pLayer;
  216.                         if (FAILED(pLayers->get_Item(&varIndex, &pLayer)))
  217.                             break;
  218.                         BSTR bstrName = NULL;
  219.                         if (SUCCEEDED(pLayer->get_Name(&bstrName)))
  220.                         {
  221.                             CString str(bstrName);
  222.                             if (!m_strAllLayers.IsEmpty())
  223.                                 m_strAllLayers += "\n";
  224.                             m_strAllLayers += str;
  225.                             ::SysFreeString(bstrName);
  226.                         }
  227.                     }
  228.                 }
  229.                 InvalidateControl();
  230.             }
  231.             pViews->Release();
  232.         }
  233.         if (FAILED(hRes))
  234.         {
  235.             pIDrawing->Close(&varMissing, &varMissing, &varMissing);
  236.             pIDrawing->Release();
  237.         }
  238.     }
  239.     pDrawings->Release();
  240.     return SUCCEEDED(hRes);
  241. }
  242.  
  243. void CSDKDemoCtrl::CloseDrawing()
  244. {
  245.     if (m_pDragGraphic != NULL)
  246.     {
  247.         m_pDragGraphic->Release();
  248.         m_pDragGraphic = NULL;
  249.     }
  250.     m_bDragging = FALSE;
  251.  
  252.     m_strAllLayers.Empty();
  253.     m_strHideLayers.Empty();
  254.     if (m_pView != NULL)
  255.     {
  256.         m_pView->Release();
  257.         m_pView = NULL;
  258.     }
  259.     if (m_pIDrawing != NULL)
  260.     {
  261.         m_pIDrawing->Close(&varMissing, &varMissing, &varMissing);
  262.         m_pIDrawing->Release();
  263.         m_pIDrawing = NULL;
  264.     }
  265.     m_bFirstDraw = TRUE;
  266. }
  267.  
  268.  
  269. /////////////////////////////////////////////////////////////////////////////
  270. // CSDKDemoCtrl::OnDraw - Drawing function
  271.  
  272. void CSDKDemoCtrl::OnDraw(
  273.             CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  274. {
  275.     {
  276.         CBrush colorBrush;
  277.         CBrush* backBrush;
  278.         if (m_pView == NULL)
  279.             backBrush = CBrush::FromHandle((HBRUSH)GetStockObject(LTGRAY_BRUSH));
  280.         else
  281.         {
  282.             colorBrush.CreateSolidBrush(GetBackColor());
  283.             backBrush = &colorBrush;
  284.         }
  285.         pdc->FillRect(rcBounds, backBrush);
  286.     }
  287.     if (m_pView == NULL)
  288.         return;
  289.  
  290.     HDC hDC = pdc->m_hDC;
  291.     m_pView->put_Update(FALSE);
  292.     m_pView->put_DC((long)hDC);
  293.     m_pView->put_MappingMode(MM_TEXT);
  294.     m_pView->put_Margins(FALSE);
  295.     m_pView->put_FixedAspectRatio(TRUE);
  296.     m_pView->put_ScreenLeft(rcBounds.left);
  297.     m_pView->put_ScreenTop(rcBounds.top);
  298.     m_pView->put_ScreenWidth(rcBounds.Width());
  299.     m_pView->put_ScreenHeight(rcBounds.Height());
  300.     if (m_bFirstDraw)
  301.     {
  302.         m_bFirstDraw = FALSE;
  303.         m_pView->ZoomToExtents();
  304.     }
  305.     m_pView->Refresh();
  306. }
  307.  
  308.  
  309. /////////////////////////////////////////////////////////////////////////////
  310. // CSDKDemoCtrl::DoPropExchange - Persistence support
  311.  
  312. void CSDKDemoCtrl::DoPropExchange(CPropExchange* pPX)
  313. {
  314.     ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  315.     COleControl::DoPropExchange(pPX);
  316.  
  317.     PX_String(pPX, _T("FileName"), m_strFileName);
  318.     PX_String(pPX, _T("HideLayers"), m_strHideLayers);
  319. }
  320.  
  321.  
  322. /////////////////////////////////////////////////////////////////////////////
  323. // CSDKDemoCtrl::OnResetState - Reset control to default state
  324.  
  325. void CSDKDemoCtrl::OnResetState()
  326. {
  327.     COleControl::OnResetState();  // Resets defaults found in DoPropExchange
  328.  
  329.     // TODO: Reset any other control state here.
  330. }
  331.  
  332.  
  333. /////////////////////////////////////////////////////////////////////////////
  334. // CSDKDemoCtrl::AboutBox - Display an "About" box to the user
  335.  
  336. void CSDKDemoCtrl::AboutBox()
  337. {
  338.     CDialog dlgAbout(IDD_ABOUTBOX_SDKDEMO);
  339.     dlgAbout.DoModal();
  340. }
  341.  
  342.  
  343. /////////////////////////////////////////////////////////////////////////////
  344. // CSDKDemoCtrl message handlers
  345.  
  346. void CSDKDemoCtrl::OnFileNameChanged() 
  347. {
  348.     OpenDrawing(m_strFileName);
  349.     SetModifiedFlag();
  350. }
  351.  
  352. UINT CountStrings(const char* lpsz)
  353. {
  354.     if (lpsz == NULL)
  355.         return 0;
  356.     UINT n = 0;
  357.     const char* p = lpsz;
  358.     while (*p)
  359.     {
  360.         ++n;
  361.         p = strchr(p, '\n');
  362.         if (p == NULL)
  363.             break;
  364.         ++p;
  365.     }
  366.     return n;
  367. }
  368.  
  369.  
  370. BOOL CSDKDemoCtrl::PreCreateWindow(CREATESTRUCT& cs) 
  371. {
  372.     // Connect to the server
  373.     static const CLSID CLSID_XApplication = {0x6A481801,0xE531,0x11CF,{0xA1,0x15,0x00,0xA0,0x24,0x15,0x8D,0xAF}};
  374.     static const IID IID_IApplication = {0x6A481101,0xE531,0x11CF,{0xA1,0x15,0x00,0xA0,0x24,0x15,0x8D,0xAF}};
  375.  
  376.     HRESULT hRes = CoCreateInstance(
  377.         CLSID_XApplication,    //Class identifier (CLSID) of the object
  378.         NULL,    //Object is or isn't part of an aggregate
  379.         CLSCTX_INPROC_SERVER,    //Context for running executable code
  380.         IID_IApplication,    //Interface identifier
  381.         (void**)&m_pIApp    //Points to requested interface pointer
  382.     );
  383.  
  384.     if (FAILED(hRes))
  385.     {
  386.         AfxMessageBox(_T("Couldn't create application object (in-process server)!"));
  387.         return FALSE;
  388.     }
  389.     
  390.     return COleControl::PreCreateWindow(cs);
  391. }
  392.  
  393. int CSDKDemoCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  394. {
  395.     if (COleControl::OnCreate(lpCreateStruct) == -1)
  396.         return -1;
  397.     
  398.     // If we are started from a property set with a FileName
  399.     // tTry to open the drawing now
  400.     if (!m_strFileName.IsEmpty())
  401.         OpenDrawing(m_strFileName);
  402.     
  403.     return 0;
  404. }
  405.  
  406. void CSDKDemoCtrl::OnHideLayersChanged() 
  407. {
  408.     if (m_pIDrawing != NULL)
  409.     {
  410.         Layers* pLayers;
  411.         if (SUCCEEDED(m_pIDrawing->get_Layers(&pLayers)))
  412.         {
  413.             COleVariant varIndex(0L);
  414.             for ( ; ; varIndex.lVal++)
  415.             {
  416.                 Layer* pLayer;
  417.                 if (FAILED(pLayers->get_Item(&varIndex, &pLayer)))
  418.                     break;
  419.                 pLayer->put_Visible(TRUE);
  420.                 pLayer->Release();
  421.             }
  422.             for (int i = 0; ; i++)
  423.             {
  424.                 CString str;
  425.                 if (!AfxExtractSubString(str, m_strHideLayers, i, '\n'))
  426.                     break;
  427.                 if (!str.IsEmpty())
  428.                 {
  429.                     Layer* pLayer;
  430.                     COleVariant varName(str);
  431.                     if (SUCCEEDED(pLayers->get_Item(&varName, &pLayer)))
  432.                     {
  433.                         pLayer->put_Visible(FALSE);
  434.                         pLayer->Release();
  435.                     }
  436.                 }
  437.             }
  438.         }
  439.     }
  440.         
  441.     SetModifiedFlag();
  442. }
  443.  
  444. BSTR CSDKDemoCtrl::GetAllLayers() 
  445. {
  446.     return m_strAllLayers.AllocSysString();
  447. }
  448.  
  449. BOOL CSDKDemoCtrl::BeginDrag(const CPoint& point)
  450. {
  451.     VariantClear(&m_dragOutline);
  452.     SAFEARRAYBOUND bound;
  453.     bound.cElements = 0;
  454.     bound.lLbound = 0;
  455.     m_dragOutline.vt = VT_ARRAY|VT_R8;
  456.     m_dragOutline.parray = ::SafeArrayCreate(VT_R8, 1, &bound);
  457.     HRESULT hRes = m_pDragGraphic->CreateDragOutline(&m_dragOutline);
  458.     if (FAILED(hRes))
  459.         return FALSE;
  460.  
  461.     m_bDragging = TRUE;
  462.     m_pDragGraphic->put_Visible(FALSE);
  463.     InvalidateControl();
  464.     UpdateWindow();
  465.  
  466.     SetCapture();
  467.     CDC* pDC = GetDC();
  468.     m_pView->put_DC((long)pDC->m_hDC);
  469.     VARIANT varState;
  470.     varState.vt = VT_I4;
  471.     varState.lVal = imsiDragBegin;
  472.     hRes = m_pView->DragOutline(&m_dragOutline, m_ptMouseDown.x, m_ptMouseDown.y, &varState);
  473.     varState.lVal = imsiDragContinue;
  474.     hRes = m_pView->DragOutline(&m_dragOutline, point.x, point.y, &varState);
  475.     ReleaseDC(pDC);
  476.     return TRUE;
  477. }
  478.  
  479. void CSDKDemoCtrl::Drag(const CPoint& point)
  480. {
  481.     if (m_pView == NULL)
  482.         return;
  483.  
  484.     CDC* pDC = GetDC();
  485.     m_pView->put_DC((long)pDC->m_hDC);
  486.     VARIANT varState;
  487.     varState.vt = VT_I4;
  488.     varState.lVal = imsiDragContinue;
  489.     HRESULT hRes = m_pView->DragOutline(&m_dragOutline, point.x, point.y, &varState);
  490.     ReleaseDC(pDC);
  491. }
  492.  
  493. void CSDKDemoCtrl::EndDrag(const CPoint& point)
  494. {
  495.     m_bDragging = FALSE;
  496.     ReleaseCapture();
  497.     if (m_pView == NULL || m_pDragGraphic == NULL)
  498.         return;
  499.  
  500.     CDC* pDC = GetDC();
  501.     m_pView->put_DC((long)pDC->m_hDC);
  502.     VARIANT varState;
  503.     varState.vt = VT_I4;
  504.     varState.lVal = imsiDragEnd;
  505.     HRESULT hRes = m_pView->DragOutline(&m_dragOutline, point.x, point.y, &varState);
  506.     ReleaseDC(pDC);
  507.  
  508.     VariantClear(&m_dragOutline);
  509.  
  510.     double dx, dy;
  511.     hRes = m_pView->ScreenToView(point.x, point.y, &dx, &dy);
  512.     dx -= m_dragX;
  513.     dy -= m_dragY;
  514.     hRes = m_pDragGraphic->MoveRelative(dx, dy, 0.0, NULL);
  515.     m_pDragGraphic->put_Visible(TRUE);
  516.     m_pDragGraphic->Release();
  517.     m_pDragGraphic = NULL;
  518.     InvalidateControl();
  519. }
  520.  
  521. void CSDKDemoCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  522. {
  523.     m_ptMouseDown = point;
  524.     if (m_pDragGraphic != NULL)
  525.     {
  526.         m_pDragGraphic->Release();
  527.         m_pDragGraphic = NULL;
  528.     }
  529.  
  530.     if (m_pView != NULL)
  531.     {
  532.         HRESULT hRes = m_pView->ScreenToView(point.x, point.y, &m_dragX, &m_dragY);
  533.         PickResult* pickResult;
  534.         hRes = m_pView->PickPoint(m_dragX, m_dragY, 
  535.             &varMissing, // Aperture
  536.             &varMissing, // TopLevel, 
  537.             &varMissing, // Arcs 
  538.             &varMissing, // Text 
  539.             &varMissing, // Segments 
  540.             &varMissing, // Blocks 
  541.             &varMissing, // Invisible 
  542.             &pickResult);
  543.         if (SUCCEEDED(hRes))
  544.         {
  545.             long lCount = 0;
  546.             hRes = pickResult->get_Count(&lCount);
  547.             if (lCount > 0)
  548.             {
  549.                 COleVariant varIndex(0L);
  550.                 PickEntry* pickEntry;
  551.                 hRes = pickResult->get_Item(&varIndex, &pickEntry);
  552.                 if (SUCCEEDED(hRes))
  553.                 {
  554.                     IGraphic* pIGraphic;
  555.                     hRes = pickEntry->get_Graphic(&pIGraphic);
  556.                     if (SUCCEEDED(hRes))
  557.                         m_pDragGraphic = pIGraphic;
  558.                     pickEntry->Release();
  559.                 }
  560.             }
  561.             pickResult->Release();
  562.         }
  563.     }
  564.  
  565.     COleControl::OnLButtonDown(nFlags, point);
  566. }
  567.  
  568. void CSDKDemoCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
  569. {
  570.     if (m_bDragging)
  571.         EndDrag(point);
  572.     else if (m_pDragGraphic != NULL)
  573.     {
  574.         m_pDragGraphic->Release();
  575.         m_pDragGraphic = NULL;
  576.     }
  577.     
  578.     COleControl::OnLButtonUp(nFlags, point);
  579. }
  580.  
  581. void CSDKDemoCtrl::OnMouseMove(UINT nFlags, CPoint point) 
  582. {
  583.     if (m_pDragGraphic != NULL && !m_bDragging && (nFlags & MK_LBUTTON))
  584.     {
  585.         if (!BeginDrag(point))
  586.         {
  587.             m_pDragGraphic->Release();
  588.             m_pDragGraphic = NULL;
  589.         }
  590.     }
  591.     else if (m_bDragging)
  592.     {
  593.         if (nFlags & MK_LBUTTON)
  594.             Drag(point);
  595.         else
  596.             EndDrag(point);
  597.     }
  598.     
  599.     COleControl::OnMouseMove(nFlags, point);
  600. }
  601.